import {
	createConnection,
	TextDocuments,
	ProposedFeatures,
	InitializeParams,
	DidChangeConfigurationNotification,
	CompletionItem,
	TextDocumentPositionParams,
	TextDocumentSyncKind,
	InitializeResult,
	DocumentDiagnosticReportKind,
	type DocumentDiagnosticReport,
} from 'vscode-languageserver/node'

import {
	TextDocument
} from 'vscode-languageserver-textdocument'

// 导入服务模块
import { validateTextDocument } from './services/documentValidator'
import { provideCompletionItems, resolveCompletionItem } from './services/codeCompletion'

// 创建语言服务器连接
const connection = createConnection(ProposedFeatures.all)

// 创建文档管理器，用于跟踪打开的文档
const documents: TextDocuments<TextDocument> = new TextDocuments(TextDocument)

// 功能支持标志
let hasConfigurationCapability = false
let hasWorkspaceFolderCapability = false

/**
 * 初始化语言服务器
 * @param params 初始化参数
 * @returns 初始化结果
 */
connection.onInitialize((params: InitializeParams) => {
	const capabilities = params.capabilities

	// 检查客户端是否支持配置功能
	hasConfigurationCapability = !!(capabilities.workspace && !!capabilities.workspace.configuration)
	
	// 检查客户端是否支持工作区文件夹功能
	hasWorkspaceFolderCapability = !!(capabilities.workspace && !!capabilities.workspace.workspaceFolders)

	// 配置服务器功能
	const result: InitializeResult = {
		capabilities: {
			// 启用增量文档同步
			textDocumentSync: TextDocumentSyncKind.Incremental,
			// 启用代码补全功能
			completionProvider: {
				resolveProvider: true
			},
			// 启用诊断功能（语法检查）
			diagnosticProvider: {
				interFileDependencies: false,
				workspaceDiagnostics: false
			}
		}
	}
	
	// 如果支持工作区文件夹，则添加相关配置
	if (hasWorkspaceFolderCapability) {
		result.capabilities.workspace = {
			workspaceFolders: {
				supported: true
			}
		}
	}
	
	return result
})

/**
 * 连接初始化完成后的回调
 * 注册各种通知和事件处理器
 */
connection.onInitialized(() => {
	// 如果支持配置功能，则注册配置变更通知
	if (hasConfigurationCapability) {
		connection.client.register(DidChangeConfigurationNotification.type, undefined)
	}
	
	// 如果支持工作区文件夹功能，则注册文件夹变更事件
	if (hasWorkspaceFolderCapability) {
		connection.workspace.onDidChangeWorkspaceFolders(_event => {
			connection.console.log('工作区文件夹发生变更')
		})
	}
})

/**
 * 配置变更处理函数
 * 当用户更改配置时刷新诊断信息
 */
connection.onDidChangeConfiguration(change => {
	connection.languages.diagnostics.refresh()
})

/**
 * 文档关闭事件处理
 * 清理已关闭文档的诊断信息
 */
documents.onDidClose(e => {
	connection.sendDiagnostics({ uri: e.document.uri, diagnostics: [] })
})

/**
 * 诊断请求处理函数
 * 当需要对文档进行语法检查时调用
 */
connection.languages.diagnostics.on(async (params) => {
	const document = documents.get(params.textDocument.uri)
	
	// 如果文档存在，则进行验证并返回诊断结果
	if (document !== undefined) {
		return {
			kind: DocumentDiagnosticReportKind.Full,
			items: await validateTextDocument(document)
		} satisfies DocumentDiagnosticReport
	} else {
		// 如果文档不存在，返回空的诊断结果
		return {
			kind: DocumentDiagnosticReportKind.Full,
			items: []
		} satisfies DocumentDiagnosticReport
	}
})

/**
 * 文档内容变更事件处理
 * 当文档内容发生变化时触发验证
 */
documents.onDidChangeContent(change => {
	validateTextDocument(change.document)
})

/**
 * 监视文件变更事件处理
 * 当工作区中的文件发生变更时触发
 */
connection.onDidChangeWatchedFiles(_change => {
	connection.console.log('监视的文件发生变更')
})

/**
 * 代码补全请求处理
 * 提供关键字补全建议
 */
connection.onCompletion(
	(params: TextDocumentPositionParams): CompletionItem[] => {
		return provideCompletionItems(params)
	}
)

/**
 * 补全项详细信息解析
 * 为补全项提供详细说明和文档
 */
connection.onCompletionResolve(
	(item: CompletionItem): CompletionItem => {
		return resolveCompletionItem(item)
	}
)

// 启动文档监听和连接监听
documents.listen(connection)
connection.listen()